/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-12-23 13:16:56
 * @description: ts 中的索引类型
 */

/**
 *   索引类型查询操作符（keyof)
 *   索引访问操作符（T[K]）。
 */
// 1.索引类型 访问操作符 keyof
// keyof 可以获取对象的 **可访问** 索引字符串字面量类型
interface IUser {
    id: number
    phone: string
    nickname: string
    readonly department: string
}

class Token {
    private secret: string | undefined
    public accessExp: number = 60 * 60
    public refreshExp: number = 60 * 60 * 24 * 30 * 3
}

// keyof 获取对象的 可访问属性
let user: keyof IUser // let user: "id" | "phone" | "nickname" | "department"
type token = keyof Token // type token = "accessExp" | "refreshExp"

//2. 索引访问操作符 T[k]
namespace A {
    class Token {
        public secret: string = 'ixeFoe3x.2doa'
        public accessExp: number = 60 * 60
        public refreshExp: number = 60 * 60 * 24 * 30 * 3
    }

    type token = keyof Token
    type valueType = Token[token] // type valueType = string | number
    type secret = Token['secret'] // type secret = string
}
